package william.string;

/**
 * @author ZhangShenao
 * @date 2024/3/2
 * @description <a href="https://leetcode.cn/problems/reverse-string/">...</a>
 */
public class Leetcode344_反转字符串 {
    /**
     * 采用指针对撞法
     * 同时从首、尾遍历字符串,将两个字符交换
     * <p>
     * 时间复杂度O(N) 只遍历字符串一次
     * 空间复杂度O(1)
     */
    public void reverseString(char[] s) {
        //边界条件校验
        if (s == null || s.length < 2) {
            return;
        }

        //采用指针对撞法,同时从首、尾遍历字符串,将两个字符交换
        int l = 0;
        int r = s.length - 1;
        while (l < r) {  //l==r时,只剩下一个元素,无需交换
            swap(s, l++, r--);
        }
    }

    /**
     * 将数组i,j两个位置的元素交换
     */
    private void swap(char[] s, int i, int j) {
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}
